Skip to content

feat(desktop): expose interrupted-turn auto-resume setting - #3642

Open
PeaceMaker-best wants to merge 4 commits into
makecindy:mainfrom
PeaceMaker-best:feat/interrupted-auto-resume-setting-peacemaker
Open

feat(desktop): expose interrupted-turn auto-resume setting#3642
PeaceMaker-best wants to merge 4 commits into
makecindy:mainfrom
PeaceMaker-best:feat/interrupted-auto-resume-setting-peacemaker

Conversation

@PeaceMaker-best

@PeaceMaker-best PeaceMaker-best commented Aug 30, 2026

Copy link
Copy Markdown

这次改了什么

摘要

把已有的 interrupted-turn auto-resume 隐藏开关正式放进「设置 → 应用行为」。默认行为保持不变(开启);用户可关闭并恢复默认值。

关闭后只撤销仍在退避等待中的自动继续,并恢复原错误供用户手动处理;已经开始分类或派发的续跑不会被中途终止。该开关不改变 provider/SDK 自身的请求重试,也不影响 silent-stop auto-resume。设置持久化失败时,底层文件系统异常只记录在 Main 日志,Renderer 仅收到不含本机路径的稳定 IPC 错误。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:Closes 为「连接中断后自动继续」增加开关,或改为断连恢复后暂停待确认 #3367
  • 本 PR 包含:可信 Desktop IPC、原子 override settings store、待触发排期取消、设置页开关/恢复默认、五语文案与回归测试
  • 明确不包含:provider/SDK retry 策略、silent-stop auto-resume、移动端设置 UI
  • 用户可见变化:「应用行为」新增「连接中断后自动继续任务」开关
  • 是否存在 breaking change:无;默认仍为开启
  • Remote / mobile 结论:该设置是 Desktop Host 级主开关,同样约束此 Host 上本地或 SSH task 的 interrupted-turn auto-resume;不读取远程工作区。device-link/mobile 不新增通道、allowlist 或 UI,被控 Desktop 仍执行 Host 侧设置。

UI 变化

  • 界面效果证据:见下方 HTML 代码块(按最终组件结构与 zh-CN 文案整理,展示默认开启态和用户关闭后的自定义态)。本地未启动 Electron,不将该证据声称为真机截图;DOM 交互测试覆盖加载、关闭、恢复默认和延迟初读竞态。
  • 引用的设计规范:docs/design-rules/DESIGN.md §4 Component Stylings(复用现有 Settings 卡片、Switch 和 DefaultOverrideControls);§10 Theme System & Token Reference(只使用现有 theme token,无 raw color,自动继承 Light/Dark 与自定义主题);§11 Voice & Content(zh-CN / zh-TW / en / ja / ko 同步,英文标题使用 Title Case);§14 Interaction Conventions(沿用 Switch 的 focus/disabled/transition,不新增动效)。Light/Dark 未做目视验证,未声称已验证。

界面效果证据(HTML)

<section aria-labelledby="app-behavior-title" style="display:grid;gap:14px;width:620px">
  <h2 id="app-behavior-title" style="color:var(--settings-section-title)">应用行为</h2>

  <!-- 默认态:开启、无 override -->
  <div style="display:flex;align-items:center;justify-content:space-between;gap:12px;padding:20px;border:1px solid var(--settings-theme-card-border);border-radius:12px;background:var(--settings-theme-card-bg)">
    <div>
      <strong style="color:var(--settings-section-sublabel)">连接中断后自动继续任务</strong>
      <p style="color:var(--settings-section-sublabel);opacity:.7">运行中的任务因可恢复的连接错误中断时,Cindy 会短暂等待后自动继续。此设置不影响供应商自身的请求重试。</p>
    </div>
    <button role="switch" aria-checked="true" aria-label="连接中断后自动继续任务" style="width:36px;height:20px;border:0;border-radius:999px;background:var(--switch-track-on)">
      <span style="display:block;width:16px;height:16px;margin-left:16px;border-radius:50%;background:var(--background)"></span>
    </button>
  </div>

  <!-- 用户关闭后:显示 override badge 与恢复默认入口 -->
  <div style="display:flex;align-items:center;justify-content:space-between;gap:12px;padding:20px;border:1px solid var(--settings-theme-card-border);border-radius:12px;background:var(--settings-theme-card-bg)">
    <div>
      <strong style="color:var(--settings-section-sublabel)">连接中断后自动继续任务</strong>
      <p style="color:var(--settings-section-sublabel);opacity:.7">运行中的任务因可恢复的连接错误中断时,Cindy 会短暂等待后自动继续。此设置不影响供应商自身的请求重试。</p>
    </div>
    <div style="display:flex;align-items:center;gap:8px">
      <span style="padding:4px 8px;border-radius:999px;background:var(--surface-chip);color:var(--text-secondary)">已自定义</span>
      <button type="button" aria-label="恢复默认" style="width:30px;height:30px"></button>
      <button role="switch" aria-checked="false" aria-label="连接中断后自动继续任务" style="width:36px;height:20px;border:0;border-radius:999px;background:var(--switch-track-off)">
        <span style="display:block;width:16px;height:16px;border-radius:50%;background:var(--switch-thumb-off)"></span>
      </button>
    </div>
  </div>
</section>

证据范围:只展示本 PR 新增设置行;结构、20px 卡片内边距、12px 圆角、Switch、override badge 与恢复默认入口均对应最终组件。颜色只引用现有 theme token,因此同一结构覆盖 Light / Dark / 自定义主题。

怎么验证的

自动验证

pnpm test:unit:related
结果:PASS,apps/desktop unit(156.4s,rebase 到最新 main 后复跑)

pnpm --filter desktop run --if-present typecheck
结果:PASS

pnpm --filter desktop exec vitest run <4 个相关测试文件>
结果:PASS(核心定向用例;随后 test:unit:related 覆盖最终提交)

pnpm check:i18n
结果:PASS,5 个 locale 共 8522 个 key 一致

pnpm check:i18n-glossary
结果:PASS,无新增术语违规

pnpm check:dco
结果:PASS,3 个 commits signed off

pnpm --filter desktop exec eslint <本次常规改动文件,不含 register.ts>
结果:PASS

手工验证

未启动 Electron;提供了按最终组件结构整理的 HTML 界面证据。逻辑、IPC sender fence、错误净化、store 与 renderer 交互均由自动测试覆盖。

未执行的验证

  • 未做 Light / Dark 目视验证;本次复用既有卡片与 token,PR 不把复用等同于目视通过。
  • pnpm --filter desktop lint 在当前 main 的存量 lint 基线上失败(446 errors / 5 warnings)。本 PR 新增文件及除 register.ts 外的相关改动文件定向 lint 通过;register.ts 只命中 6 个本 PR 未触及的存量 unused 报告。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:仅 Desktop Host 的 interrupted-turn task-level auto-resume。新增设置文件继续使用原路径,改为跨进程锁内原子写;手改文件由 guard 在每次决策时直接读取有 4 KiB 上限的小文件,无 mtime 缓存盲区,坏文件保留、回落默认开启,并在 UI 显示恢复默认入口。GET / SET / RESET 均要求可信顶层 renderer。
  • 失败半径:关闭时只取消精确 session/attempt 的未触发 backoff;已 fire 或 vendor 在途 attempt 不终止。无 device-link 重试/断连流程变更,无多 peer 状态变更。
  • 跨平台:设置行在 macOS / Windows / Linux 常驻,行为由平台无关 Host 调度器执行;未加入平台专属原生代码。
  • 回滚 / 降级方式:回滚本提交即可移除 UI/IPC;旧的默认开启行为与 settings 文件路径均保持兼容。用户也可在 UI 恢复默认值(删除 override)。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s
  • UI 改动已在「UI 变化」注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档(代码内契约与 PR 范围;无需独立用户文档)
  • 已确认测试结果或说明未执行原因

@PeaceMaker-best
PeaceMaker-best requested a review from a team as a code owner August 30, 2026 12:51

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 06593e8119

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@greptile-apps

greptile-apps Bot commented Aug 30, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 将连接中断后的任务自动续跑开关正式接入 Desktop 设置,并补齐可信 IPC、持久化 override、等待期取消及多语言 UI。

  • 新增 GET、SET、RESET preload/main IPC,并在主进程校验 sender 与参数
  • 将隐藏配置迁移到原子 override settings store,默认继续保持开启
  • 关闭设置时仅取消尚未触发的退避排期,并恢复原始错误
  • 设置页新增开关、恢复默认控件以及五种语言文案
  • 增加存储、排期取消、接线和 renderer 竞态测试

Confidence Score: 4/5

该 PR 看起来可以合并,但建议修正或明确处理手动 kill switch 在 mtime 未变化时可能无法立即生效的边缘情况。

主 IPC、取消排期和错误恢复链路保持一致,唯一保留的问题是新的 mtime 缓存可能短暂忽略一次外部配置内容变化。

Files Needing Attention: apps/desktop/src/main/maker-host/interrupted-turn-auto-resume-store.ts

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-host/interrupted-turn-auto-resume-store.ts 将逐次磁盘读取迁移到带 mtime 缓存的原子 override store,但手动逃生门存在同时间戳编辑未被识别的边缘情况。
apps/desktop/src/main/maker-ipc/autoResumeBookkeeping.ts 新增只取消未触发退避 timer 的批量操作,并保留已进入异步执行阶段的 attempt。
apps/desktop/src/main/maker-ipc/register.ts 将新设置作为 interrupted-turn auto-resume 主门控,并在退避触发前再次热读配置。
apps/desktop/src/main/bootstrap-electron.ts 新增经可信 renderer 校验的设置 GET、SET、RESET IPC,关闭时同步取消等待排期。
apps/desktop/src/renderer/hooks/useInterruptedTurnAutoResumeSettings.ts 新增以主进程为权威来源的设置 hook,并防止延迟初读覆盖本地提交。
apps/desktop/src/renderer/components/settings/WindowBehaviorSection.tsx 在应用行为设置中加入跨平台自动续跑开关和恢复默认控件。

Sequence Diagram

sequenceDiagram
  participant U as 用户
  participant R as Settings Renderer
  participant P as Preload
  participant M as Electron Main
  participant S as Override Store
  participant B as AutoResumeBookkeeping
  U->>R: 关闭自动续跑
  R->>P: interruptedTurnAutoResumeSet(false)
  P->>M: 固定 IPC channel
  M->>M: 校验可信 sender 与布尔参数
  M->>S: "原子写入 enabled=false"
  M->>B: cancelWaitingSchedules()
  B->>B: 取消未触发 timer 并恢复被压制错误
  M-->>R: 返回权威设置状态
Loading
Prompt To Fix All With AI
### Issue 1
apps/desktop/src/main/maker-host/interrupted-turn-auto-resume-store.ts:59-60
**mtime 缓存削弱手动逃生门**

如果用户或自动化程序在文件系统时间戳粒度内原地修改配置,`invalidateIfChanged()` 会继续使用旧缓存,导致写入的 `enabled: false` 无法立即阻止下一次自动续跑。现有测试通过主动将 mtime 推后两秒避开了这一情况;建议改为不依赖 mtime 唯一识别内容变化,或明确采用能够保证变更版本递增的机制。

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Reviews (1): Last reviewed commit: "feat(desktop): expose interrupted-turn a..." | Re-trigger Greptile

@PeaceMaker-best

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3a6a7750d6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/desktop/src/main/bootstrap-electron.ts Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@PeaceMaker-best 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/bootstrap-electron.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) labels Aug 30, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

这条 PR 新增了用户可改的「中断回合自动继续」设置,属于产品方向,先进入维护者确认,不会自动合并。

请维护者在 PR 上 Approve 放行;要改就 Request Changes。讨论 issue:#3644

@MagicLizi MagicLizi added the awaiting-discussion 等待维护者讨论(review-pr) label Aug 30, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

命中 UI 路径(apps/desktop/src/renderer/components/settings/WindowBehaviorSection.tsx / apps/desktop/src/renderer/hooks/useInterruptedTurnAutoResumeSettings.ts)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范。

Signed-off-by: PeaceMaker-best <221849497+PeaceMaker-best@users.noreply.github.com>
Signed-off-by: PeaceMaker-best <221849497+PeaceMaker-best@users.noreply.github.com>
Signed-off-by: PeaceMaker-best <221849497+PeaceMaker-best@users.noreply.github.com>
@PeaceMaker-best
PeaceMaker-best force-pushed the feat/interrupted-auto-resume-setting-peacemaker branch from 3a6a775 to 6ca5ee2 Compare August 30, 2026 14:11
@PeaceMaker-best

Copy link
Copy Markdown
Author

已按 UI evidence notice 补充 PR description:新增最终设置行的 HTML 效果证据,分别展示默认开启态与用户关闭后的「已自定义 + 恢复默认」态,并明确标注这不是 Electron 真机截图。证据使用与最终组件一致的卡片尺寸、Switch/override 控件结构和 theme token;Light/Dark 仍如实标为未做目视验证。

@PeaceMaker-best

Copy link
Copy Markdown
Author

@codex review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. What shall we delve into next?

Reviewed commit: 6ca5ee2eed

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@PeaceMaker-best

Copy link
Copy Markdown
Author

@MagicLizi #3644 列出的技术放行条件现已全部收口:mtime 同时间戳内容变更问题已修复并补回归测试,bootstrap-electron.ts conversation 已 resolve,UI evidence 已补到 PR description,最新 @codex review6ca5ee2eed 上未发现 major issue,当前所有 review thread 均已解决且 DCO 为绿。产品方向也已在 #3644 确认;烦请维护者做最终 Approve。

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6ca5ee2eed

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread apps/desktop/src/renderer/i18n/locales/en/common.json Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@PeaceMaker-best 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/renderer/i18n/locales/en/common.json),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

Signed-off-by: PeaceMaker-best <221849497+PeaceMaker-best@users.noreply.github.com>
@MagicLizi

Copy link
Copy Markdown
Contributor

@PeaceMaker-best 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

为「连接中断后自动继续」增加开关,或改为断连恢复后暂停待确认

2 participants